home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / EGAVGA.SWG / 0149_Quick 256 VGA Palette Cycling.pas < prev    next >
Pascal/Delphi Source File  |  1995-03-03  |  3KB  |  132 lines

  1. {
  2. > Any one out there have code to do this
  3. >
  4. > Rotate_PAL_Up(count : byte; from,to: byte):
  5. >   ie.  Rotate_Pal_Up(10,100,120);
  6. >   will rotate the pal up 10 times between the ranges of 100   and 12
  7. > back after 120...
  8. >
  9. > Rotate_Pal_Down(c,f,t : byte);  basicly same as abov! Thanks!
  10.  
  11. You asked for the palette cycling routine, here you are! As you can see,
  12. there is NO cycling routine in this piece of code which does all the job.
  13. There are several smaller routines (GetRGB, SetRGB etc.) and then the actual
  14. cycling routine which uses other smaller routines. That's because all these
  15. routines are from my own vga util library and I was too lazy to put them to
  16. together to a one piece of code... :)
  17. }
  18.  
  19. Program CyclePaletteExample;
  20.  
  21. Uses crt;
  22.  
  23. Type  PaletteType                 = Record
  24.        red                        : Byte;
  25.        green                      : Byte;
  26.        blue                       : Byte;
  27.       End;
  28.  
  29. Var   rgb                         : PaletteType;
  30.       pal                         : Array [0..255] of PaletteType;
  31.  
  32. Var   aa1                         : Word; {Some temp variables}
  33.       aa5                         : Byte;
  34.  
  35. Procedure SetRGB(col, r, g, b : Byte);
  36.  
  37. Begin
  38.  ASM
  39.   CLI
  40.  END;
  41.  Port[$3C8] := col;
  42.  Port[$3C9] := r;
  43.  Port[$3C9] := g;
  44.  Port[$3C9] := b;
  45.  ASM
  46.   STI
  47.  END;
  48. End;
  49.  
  50. Procedure GetRGB(col : Byte);
  51.  
  52. Begin
  53.  Port[$3C7] := col;
  54.  rgb.red := Port[$3C9];
  55.  rgb.green := Port[$3C9];
  56.  rgb.blue := Port[$3C9];
  57. End;
  58.  
  59. Procedure SetPalette;
  60.  
  61. Begin
  62.  For aa5 := 0 to 255 Do SetRGB(aa5,pal[aa5].red,pal[aa5].green,pal[aa5].blue);
  63. End;
  64.  
  65. Procedure GetPalette;
  66.  
  67. Begin
  68.  For aa5 := 0 to 255 Do Begin
  69.   GetRGB(aa5);
  70.   pal[aa5] := rgb;
  71.  End;
  72. End;
  73.  
  74. Procedure CyclePalette(s, e, n, d : Byte);
  75.  
  76. Var c1 : PaletteType;
  77.  
  78. Begin
  79.  If d = 1 then Begin
  80.   aa1 := 0;
  81.   Repeat
  82.    c1 := pal[e];
  83.    For aa5 := e downto s + 1 Do Begin
  84.     pal[aa5] := pal[aa5 - 1];
  85.    End;
  86.    pal[s] := c1;
  87.    Inc(aa1);
  88.    SetPalette; {Sets cycled palette}
  89.   Until aa1 = n;
  90.  End;
  91.  If d = 2 then Begin
  92.   aa1 := 0;
  93.   Repeat
  94.    c1 := pal[s];
  95.    For aa5 := s to e - 1 Do Begin
  96.     pal[aa5] := pal[aa5 + 1];
  97.    End;
  98.    pal[e] := c1;
  99.    Inc(aa1);
  100.    SetPalette; {Sets cycled palette}
  101.   Until aa1 = n;
  102.  End;
  103. End;
  104.  
  105. Begin
  106.  ASM
  107.   MOV  AX,$13 {Video mode is now 13h = 320 x 200 and 256 colors}
  108.   INT  $10
  109.  End;
  110.  For aa1 := 0 to 255 Do Mem[$A000:aa1] := aa1; {Draw 255 pixels}
  111.  GetPalette; {Loads palette from vga's registers}
  112.  Repeat
  113.   CyclePalette(1,255,1,1); {Palette cycling!}
  114.  Until KeyPressed; {Press any key to continue! :)}
  115.  ASM
  116.   MOV  AX,$3 {Back to the text mode}
  117.   INT  $10
  118.  End;
  119. End.
  120.  
  121. {
  122. Example:
  123.  
  124. CyclePalette(120, 140, 10, 1) would rotate colors between the ranges
  125. 120 and 140 10 times.
  126.  
  127. The last parameter (d) is the direction of palette rotation:
  128.  
  129. 1       From the first specified color to the last specified color
  130. 2       From the last specified color to the first specified color
  131. }
  132.